import router, { asyncRoutes } from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 加载进度条插件
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // 从cookie中获取令牌
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whiteList = ['/login', '/404'] // 没有重定向白名单

router.beforeEach(async (to, from, next) => {
  // start 显示进度条
  NProgress.start()
  // 每次跳转时 将文档的 title 值改成 当前跳转路由里的 title
  document.title = getPageTitle(to.meta.title)

  // 确定用户是否已登录
  const hasToken = getToken()
  if (hasToken) {
    // 如果已经登录则去主页
    if (to.path === '/login') {
      console.log('有token 直接去主页')
      next('/')
      NProgress.done()
    } else {
      if (store.getters.userId) {
        next()
      } else {
        try {
          // 获取个人信息
          const menus = await store
            .dispatch('user/getUserInfo')
            .catch(err => err)
          // console.log('当前用户能访问的页面', menus) // ['salarys', 'settings']
          // console.log('当前系统功能中提供的所有的动态路由页面是', asyncRoutes)

          // 根据本用户实际的权限menus去 asyncRoutes 中做过滤，选出本用户能访问的页面
          const filterRestes = asyncRoutes.filter(route => {
            const routeName = route.children[0].name
            return menus.includes(routeName)
          })
          // 一定要在进入主页之前去获取用户信息

          // 把404加到最后一条
          filterRestes.push(
            // 404 page must be placed at the end !!!
            { path: '*', redirect: '/404', hidden: true }
          )
          // addRoutes用来动态添加路由配置
          // 只有在这里设置了补充了路由配置，才可能去访问页面
          // 它们不会出现左侧
          router.addRoutes(filterRestes)
          // 根据用户实际能访问几个页面来决定从整体8个路由设置
          // 中，过滤中出来几个，然后保存到vuex中
          store.commit('menu/setMenuList', filterRestes)
          // 解决刷新出现的白屏bug
          // next({
          //   ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
          //   replace: true // 重进一次, 不保留重复历史
          // })
          next(to.path)
        } catch (error) {
          // 删除令牌，进入登录页面重新登录
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    // 没有登录只能去白名单
    if (whiteList.includes(to.path)) {
      console.log('没有token 只能去 白名单')
      next()
    } else {
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})
